﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;

//namespace ArgusPCLib.Mathematics
//{
//	public class BigFraction : ILinearScalar
//	{
//		#region Constructors
//		public BigFraction(BigFraction fraction)
//		{
//			this.Numerator = fraction.Numerator;
//			this.Denominator = fraction.Denominator;
//		}

//		public BigFraction(Integer value)
//		{
//			this.Numerator = value;
//			this.Denominator = Integer.One;
//		}

//		public BigFraction(Integer num, Integer den)
//			: this(num, den, Math.GCD(num, den)) { }

//		public BigFraction(Decimal d)
//		{
//			this.Numerator = new Integer(d.GetBits());
//			this.Denominator = Integer.One << d.FractionBits;
//			Integer gcd = Math.GCD(this.Numerator, this.Denominator);
//			if (gcd != 1)
//			{
//				this.Numerator /= gcd;
//				this.Denominator /= gcd;
//			}
//		}

//		private BigFraction(Integer num, Integer den, Integer gcd)
//		{
//			if (gcd != 1)
//			{
//				this.Numerator = num / gcd;
//				this.Denominator = den / gcd;
//			}
//			else
//			{
//				this.Numerator = num;
//				this.Denominator = den;
//			}
//			if (this.Denominator < 0)
//			{
//				this.Numerator = Integer.Negate(this.Numerator);
//				this.Denominator = Integer.Negate(this.Denominator);
//			}
//		}
//		#endregion

//		#region Properties
//		public static BigFraction One { get { return new BigFraction(1, 1, 1); } }
//		public static BigFraction Zero { get { return new BigFraction(0, 1, 1); } }

//		public Integer Numerator { get; private set; }
//		public Integer Denominator { get; private set; }
//		#endregion

//		#region Public Methods
//		public Decimal ToDecimal()
//		{
//			return (Decimal)this.Numerator / this.Denominator;
//		}

//		public Decimal ToDecimal(int maxFractionBits)
//		{
//			return Decimal.Divide(this.Numerator, this.Denominator, maxFractionBits);
//		}
//		#endregion

//		#region Operators
//		public static bool operator==(BigFraction a, BigFraction b)
//		{
//			return (a.Numerator == b.Numerator && a.Denominator == b.Denominator);
//		}

//		public static bool operator!=(BigFraction a, BigFraction b)
//		{
//			return (a.Numerator != b.Numerator || a.Denominator == b.Denominator);
//		}

//		public static bool operator <(BigFraction a, BigFraction b)
//		{
//			return (a.ToDecimal() < b.ToDecimal());
//		}

//		public static bool operator >(BigFraction a, BigFraction b)
//		{
//			return (a.ToDecimal() > b.ToDecimal());
//		}

//		public static bool operator <=(BigFraction a, BigFraction b)
//		{
//			return (a == b || a < b);
//		}

//		public static bool operator >=(BigFraction a, BigFraction b)
//		{
//			return (a == b || a > b);
//		}

//		public static BigFraction operator +(BigFraction a, BigFraction b)
//		{
//			Integer lcm = Math.LCM(a.Denominator, b.Denominator);
//			Integer lcmA = lcm / a.Denominator;
//			Integer lcmB = lcm / b.Denominator;
//			return new BigFraction(a.Numerator * lcmA + b.Numerator * lcmB, lcm);
//		}

//		public static BigFraction operator -(BigFraction a, BigFraction b)
//		{
//			Integer lcm = Math.LCM(a.Denominator, b.Denominator);
//			Integer lcmA = lcm / a.Denominator;
//			Integer lcmB = lcm / b.Denominator;
//			return new BigFraction(a.Numerator * lcmA - b.Numerator * lcmB, lcm);
//		}

//		public static BigFraction operator *(BigFraction a, BigFraction b)
//		{
//			Integer gcd1 = Math.GCD(a.Numerator, b.Denominator);
//			Integer gcd2 = Math.GCD(b.Numerator, a.Denominator);
//			return new BigFraction((a.Numerator / gcd1) * (b.Numerator / gcd2), (a.Denominator / gcd2) * (b.Denominator / gcd1), Integer.One);
//		}

//		public static BigFraction operator /(BigFraction a, BigFraction b)
//		{
//			Integer gcd1 = Math.GCD(a.Numerator, b.Numerator);
//			Integer gcd2 = Math.GCD(a.Denominator, b.Denominator);
//			return new BigFraction((a.Numerator / gcd1) * (b.Denominator / gcd2), (a.Denominator / gcd2) * (b.Numerator / gcd1), Integer.One);
//		}
//		#endregion

//		#region IScalar
//		string IFormattable.ToString(string format, IFormatProvider formatProvider)
//		{
//			throw new NotImplementedException();
//		}

//		bool IScalar.IsEqualTo(IScalar scalar)
//		{
//			return (this == (BigFraction)scalar);
//		}

//		IScalar IScalar.Divide(IScalar scalar)
//		{
//			return (this / (BigFraction)scalar);
//		}

//		IScalar IScalar.Subtract(IScalar scalar)
//		{
//			return (this - (BigFraction)scalar);
//		}

//		IScalar IScalar.Multiply(IScalar scalar)
//		{
//			return (this * (BigFraction)scalar);
//		}

//		IScalar IScalar.Add(IScalar scalar)
//		{
//			return (this + (BigFraction)scalar);
//		}

//		IScalar IScalar.GetCopy()
//		{
//			return new BigFraction(this);
//		}
//		#endregion

//		#region ILinearScalar
//		bool ILinearScalar.IsSmallerThan(ILinearScalar scalar)
//		{
//			return (this < (BigFraction)scalar);
//		}

//		bool ILinearScalar.IsGreaterThan(ILinearScalar scalar)
//		{
//			return (this > (BigFraction)scalar);
//		}

//		int IComparable.CompareTo(object obj)
//		{
//			BigFraction f = (BigFraction)obj;
//			if (this == f)
//				return 0;
//			if (this < f)
//				return -1;
//			return 1;
//		}
//		#endregion
//	}
//}
